package com.bdqn.sys.controller;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bdqn.common.utitls.*;
import com.bdqn.sys.entity.Permission;
import com.bdqn.sys.entity.Role;
import com.bdqn.sys.entity.User;
import com.bdqn.sys.service.PermissionService;
import com.bdqn.sys.service.RoleService;
import com.bdqn.sys.service.UserService;
import com.bdqn.sys.vo.PermissionVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.*;

@RestController
@RequestMapping("/sys/menu")
public class MenuController {

    @Resource
    private PermissionService permissionService;

    @Resource
    private UserService userService;

    @Resource
    private RoleService roleService;

    /**
     * 加载首页左侧菜单栏
     * @param permissionVo
     * @param session
     * @return
     */
    @RequestMapping("/loadIndexLefMenu")
    public DateGindViewResult   loadIndexLefMenu(PermissionVo permissionVo, HttpSession session){
        //创建集合保存菜单信息
        List<Permission> permissionList=new ArrayList<Permission>();
        //带参需要条件构造器
        QueryWrapper<Permission>  queryWrapper=new QueryWrapper<Permission>();
        queryWrapper.eq("type",SystemConstants.Type_MEMU);//只查询列明type=menu的数据

        //获取当前登录用户信息
        User user= (User) session.getAttribute(SystemConstants.LOGIN_USER);
        //上面获取到当前登录用户信息后就是用来给到下面去判断是否是超级管理员，如果是超级管理员那么就可以显示看到所有菜单栏
        if (user.getType()==SystemConstants.USER_TYPE_SUPER){//等于0那么就是超级管理员
            //调用查询菜单栏方法
            permissionList = permissionService.list(queryWrapper);
        }else {
            //不是超级管理员那么就根据身份角色和权限显示
           //1.根据当前登录用户的ID查询该用户拥有哪些角色
            Set<Integer> currentUserRoleIds = userService.findUserRoleByUserId(user.getId());
            //创建集合保存菜单
            Set<Integer> pids=new HashSet<Integer>();
            //2.循环遍历
            for (Integer roleId : currentUserRoleIds) {
                //3.根据角色ID查询每个角色有哪些权限
                Set<Integer>  permissionIds=roleService.findRolePermissionIdByRoleId(roleId);//根据角色的Id查询权限菜单
                //4.将查询出来的权限添菜单ID添加到集合中
                pids.addAll(permissionIds);

            }
            //5.判断权限集合列表中是否存在q权限列表
            if (pids.size()>0){
                //查询该角色下的权限菜单
                queryWrapper.in("id",pids);
                //查询权限列表
                permissionList = permissionService.list(queryWrapper);

            }

        }
        //菜单集合
            List<TreeNode> treeNodes=new ArrayList<TreeNode>();

        //上面如果是已经根据身份权限查询判断好那么就可以循环遍历显示菜单栏
        for (Permission permission : permissionList) {
            TreeNode  treeNode=new TreeNode();
            treeNode.setId(permission.getId());//菜单ID
            treeNode.setPid(permission.getPid());//父菜单ID
            treeNode.setTitle(permission.getTitle());//菜单名称
            treeNode.setHref(permission.getHref());//   跳转url
            treeNode.setIcon(permission.getIcon());//菜单图标
            //还有节点是否展开属性spread 但是我们展开属性数据库中是用open代表我们也不可能再该表那么可以用三元运算符
            Boolean spread=permission.getOpen()==SystemConstants.STATE_OPENT ? true : false;//判断是否展开
            treeNode.setSpread(spread);//是否展开
            //将菜单节点信息添加到菜单集合中
            treeNodes.add(treeNode);
        }
        //构建菜单节点层级关系
        List<TreeNode> build = TreeNodeBuilder.build(treeNodes, 1);//第一个参数是add添加后菜单集合，第二个参数意思是 我们的父节点从1开始
        //返回数据
        return  new DateGindViewResult(build);
    }

    /**
     * 菜单管理左侧导航树
     * @return
     */
    @RequestMapping("/loadMenuTreeLeft")
    public  DateGindViewResult loadMenuTreeLeft(){
        //创建条件构造器
        QueryWrapper<Permission> queryWrapper=new QueryWrapper<Permission>();
        queryWrapper.eq("type",SystemConstants.Type_MEMU);
        //调用查询方法
        List<Permission> list = permissionService.list(queryWrapper);
        //创建集合保存树节点
        List<TreeNode> treeNodes=new ArrayList<TreeNode>();
        for (Permission permission : list) {
            //判断是否展开
            Boolean spread=permission.getOpen()==SystemConstants.STATE_OPENT ? true : false;//判断是否展开
            //将对象添加到集合节点中
            treeNodes.add(new TreeNode(permission.getId(),permission.getPid(),permission.getTitle(),spread));
        }
        return new DateGindViewResult(treeNodes);
    }


    /**
     * 点击后右侧显示信息
     */
    @RequestMapping("/list")
    public DateGindViewResult list(PermissionVo permissionVo){
        //创建分页信息
        IPage<Permission> page=new Page<Permission>(permissionVo.getPage(),permissionVo.getLimit());
        //创建条件构造器
        QueryWrapper<Permission> queryWrapper=new QueryWrapper<Permission>();
        queryWrapper.eq("type",SystemConstants.Type_MEMU);//只查询列明type=menu的数据
        //菜单名称查询
        queryWrapper.like(StringUtils.isNotBlank(permissionVo.getTitle()),"title",permissionVo.getTitle());
        //菜单地址查询
        queryWrapper.like(StringUtils.isNotBlank(permissionVo.getHref()),"href",permissionVo.getHref());
        //菜单编号
        queryWrapper.eq(permissionVo.getId()!=null,"id",permissionVo.getId())
                .or().eq(permissionVo.getId()!=null,"pid",permissionVo.getId());
        //调用分页查询的方法
        permissionService.page(page,queryWrapper);
        //返回查询结果
        return  new DateGindViewResult(page.getTotal(),page.getRecords());//总页数 总记录数

    }



    /**
     * 菜单添加
     */
    @RequestMapping("/addMenu")
    public JSONResult AddMenu(Permission permission){
        //设置菜单类型
        permission.setType(SystemConstants.Type_MEMU);//菜单类型
        if(permissionService.save(permission)){
            return SystemConstants.Add_SUCCESS;
        }
        return SystemConstants.Add_ERROR;
    }

    /**
     * 菜单修改
     */
    @RequestMapping("/updateMenu")
    public JSONResult updateMenu(Permission permission){
        if(permissionService.updateById(permission)){
            return SystemConstants.UPDATE_SUCCESS;
        }
        return SystemConstants.UPDATE_ERROR;
    }

    /**
     * 这个方法是用来判断是否存在的子菜单的
     * @return
     */
    @RequestMapping("/checkMenuHasChild")
    public String deleteMenu(int id){
        Map<String,Object> map=new LinkedHashMap<String,Object>();
        //创建条件构造器
        QueryWrapper<Permission> queryWrapper=new QueryWrapper<Permission>();
        queryWrapper.eq("pid",id);//根据父级菜单编号查询
        if(permissionService.count(queryWrapper)>0){
            map.put(SystemConstants.EXIST,true);
        }else {
            map.put(SystemConstants.EXIST,false);
        }
        return JSON.toJSONString(map);
    }


    /**
     * 删除部门
     * @param id
     * @return
     */
    @RequestMapping("/deleteById")
    public JSONResult deleteById(int id){
        if (permissionService.removeById(id)){
            return SystemConstants.DELETE_SUCCESS;
        }
        return SystemConstants.DELETE_ERROR;
    }
}
